"""
copy
- 浅拷贝会创建一个新的对象，然后将原始对象的元素（子对象）的引用复制到新对象中。
- 深拷贝会创建一个完全独立的新对象，包括原始对象的所有子对象以及子对象的子对象。
https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4699672521750062374
"""
from copy import copy, deepcopy

# 场景1
a = [1, 2, 3, [2, 4]]
b = a
# 使用的引用，内存地址相同
print(id(a) == id(b))
# 变更也不影响
a.append(4)
print(id(a) == id(b))

# 场景2 想要一个影子拷贝
c = copy(a)
# False,内存地址发生了变更，开辟了新的内存空间
print(id(a) == id(c))

# 这个是否相同？答案：相同的
print(id(a[0]) == id(c[0]))
# 原理
# a -> |被引用的内容[1,2,3]| <- c

# 场景3 深拷贝
d = deepcopy(a)
# False
print(id(a) == id(d))
# True
print(id(a[0]) == id(d[0]))
# False why？ a[3] 是可变子对象
print(id(a[3]) == id(d[3]))

# 场景4 深浅拷贝的差别
# 差异就是修改可变子对象，深拷贝不收影响，浅拷贝会受影响
shadow_copy = copy(a)
deep_copy = deepcopy(a)
# 修改不可变子对象
a[0] = 110
print(shadow_copy)
print(deep_copy)
# 修改可变子对象
a[3][0] = 110
print(shadow_copy)  # 受影响
print(deep_copy)  # 不受影响
